package com.by.controller;

import cn.hutool.core.bean.BeanUtil;
import com.by.bean.Dept;
import com.by.bean.Employee;
import com.by.bean.User;
import com.by.common.bean.PageBean;
import com.by.common.bean.ResultBean;
import com.by.common.controller.BaseController;
import com.by.common.group.ISave;
import com.by.common.group.IUpdate;
import com.by.common.query.EmpQuery;
import com.by.mapper.UserMapper;
import com.by.service.EmployeeService;
import com.by.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Ye QS
 * @version 0.1
 * @className EmployeeController
 * @description
 * @date 2024/9/11 14:58
 * @since jdk11
 */
@RestController
@RequestMapping("/v1")
@Api(tags = "员工管理")
public class EmployeeController extends BaseController {
    @Autowired
    EmployeeService employeeService;
    @Autowired
    UserService userService;


    /**
     * 保存员工信息的API控制器方法。
     * <p>
     * 该方法接收一个 HTTP POST 请求，并对传入的 Employee 对象进行有效性验证，
     * 然后检查所提供的账号是否已被使用，最后尝试保存新的员工记录。
     *
     * @param employee 待保存的员工实体对象
     * @param result   验证结果对象，用于存储验证过程中产生的错误信息
     * @return 包含操作结果的消息对象
     */
    @ApiOperation("保存员工")
    @PostMapping("/employee")
    public ResultBean save(@Validated(ISave.class) @RequestBody Employee employee, BindingResult result) {
        // 校验输入数据的有效性
        validate(result);
        // 检查指定账号是否已存在于数据库中
        int rs = userService.queryUserByAccount(employee.getUser().getUsername());
        // 如果发现相同账号，则返回失败消息
        if (rs == 1) {
            return fail("该账号已被占用，请更换账号");
        }
        // 尝试保存员工信息
        rs = employeeService.save(employee);
        // 返回保存结果的状态信息
        return saveResult(rs);
    }

    /**
     * 处理 HTTP POST 请求，根据提供的参数查询员工列表信息。
     *
     * @param query 通过请求体传递的查询条件对象 EmpQuery，用于指定具体的筛选标准。
     * @return 包含成功状态码及查询结果的 ResultBean 对象。其中结果为 PageBean 类型，
     * 表示分页后的员工列表数据。
     * @PostMapping 注解指定了处理请求的 URL 路径为 "/employee/query"。
     */
    @ApiOperation("员工列表")
    @PostMapping("/employee/query")
    public ResultBean query(@RequestBody EmpQuery query) {
        // 将传入的 EmpQuery 对象转换成 Map 结构，便于后续处理使用。
        Map<String, Object> map = BeanUtil.beanToMap(query);

        // 调用 employeeService 中定义的方法 query 进行员工信息查询，并接收返回的分页数据。
        PageBean pageBean = employeeService.query(map);

        // 构造并返回一个包含自定义消息和实际查询结果的成功响应对象。
        return success("员工列表", pageBean);
    }

    @ApiImplicitParam(name = "id", value = "员工id", required = true, defaultValue = "0", dataTypeClass = Integer.class)
    @ApiOperation("删除员工")
    @DeleteMapping("/employee")
    public ResultBean delete(@ApiParam(name = "id", required = true, value = "要删除的id") @RequestParam(name = "id", required = true, defaultValue = "0") int id) {
        int rs = employeeService.delete(id);
        return deleteResult(rs);
    }

    @ApiOperation("修改员工信息")
    @PutMapping("/employee")
    public ResultBean update(@Validated(IUpdate.class) @RequestBody Employee employee, BindingResult result) {
        validate(result);
        int rs = employeeService.update(employee);
        return updateResult(rs);
    }

    @ApiOperation("重置密码")
    @PutMapping("/employee/resetPassword")
    public ResultBean resetPassword(@Validated(IUpdate.class) @RequestBody User user, BindingResult result) {
        validate(result);
        int rs = employeeService.resetPassword(user);
        return updateResult(rs);
    }
    @ApiOperation("获取所有员工")
    @GetMapping("/employee/getEmployeeList")
    public ResultBean getEmployeeList() {
        List<Map> list = employeeService.getEmployeeList();
        return success("列表",list);
    }
}
